package com.rizhov.graphmodels;

import com.rizhov.enumerations.GraphModelType;
import com.rizhov.enumerations.GraphOrientation;


/** Класс GraphModel реализует АТД "Простой статистический граф"*/
public interface GraphModel extends Cloneable {

    public void printGraphIntoConsole(); // вывод данных графа на консоль

    public int getVertexCount(); // получение количества вершин в графе

    public int getEdgeCount(); // получение количества ребер в графе

    public GraphOrientation getGraphDirectionType(); // получение ориентации графа

    public void setGraphOrientation(GraphOrientation graphOrientation); // установка ориентации графа
    
    public GraphModelType getGraphModelType(); // получение типа модели графа

    public double getGraphSaturationRatio(); // получение коэффициента насыщенности

    public boolean addVertex(Object vertexData); // добавление вершины в граф

    public int getVertexIndex(Object vertexData); // получение индекса вершины по ее данным

    public boolean removeVertex(Object vertexData); // удаление вершины

    public boolean addEdge(int startIndex, int endIndex, Object edgeWeight); // добавление ребра с указанным весом

    public boolean removeEdge(int startIndex, int endIndex); // удаление ребра с указанными индексами

    public boolean isEdgeExist(int startIndex, int endIndex); // проверка на существование ребра

    public boolean setEdgeWeight(int startIndex, int endIndex, Object weight); // установка веса ребра

    public Object getEdgeWeight(int startIndex, int endIndex); // получение веса ребра

    public boolean setEdgeData(int startIndex, int endIndex, Object data); // установка данных ребра

    public Object getEdgeData(int startIndex, int endIndex); // получение данных ребра

    public Object clone(); // констуруктор копирования
    
    public String getStatisticsString(); // получение статистической строки графа
    
    public Object getVertexData(int index); // получение данных вершины
    
    public boolean setVertexData(Object newVertexData, Object oldVertexData); // установка данных вершины
}
